package com.anjiplus.template.gaea.business.modules.datasetparam.util;

import org.springframework.util.PropertyPlaceholderHelper;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by raodeming on 2021/3/23.
 */
public class ParamsResolverHelper {
    private static String placeholderPrefix = "${";
    private static String placeholderSuffix = "}";
    private static PropertyPlaceholderHelper helper =
            new PropertyPlaceholderHelper(placeholderPrefix, placeholderSuffix);

    /**
     * 解析参数并将其值插入到给定的字符串中。
     *
     * @param param 包含待解析键值对的参数映射。
     * @param con 带有占位符的初始字符串，占位符将以参数映射中的值替换。
     * @return 替换占位符后的字符串。
     */
    public static String resolveParams(final Map<String, Object> param, String con) {
        con = helper.replacePlaceholders(con, (key -> param.get(key) + ""));
        return con;
    }

    /**
     * 此代码定义了一个静态的Pattern对象，用于匹配字符串中的占位符模式。
     * 占位符以${}的形式出现，并且可以包含任意字符。
     *
     * <p>Pattern对象key通过正则表达式"\$\{(.*?)\}"来定义匹配规则。
     * 这个正则表达式的含义是：
     * <ul>
     *     <li>\$\{：匹配字符串开始处的"${"</li>
     *     <li>(.*?)：匹配任意非贪婪的字符</li>
     *     <li>\}：匹配字符串结束处的"}"</li>
     * </ul>
     * 这使得key能够匹配任何形如"${content}"的字符串，其中content是任意字符序列。
     * </p>
     */
    private static Pattern key = Pattern.compile("\\$\\{(.*?)\\}");

    public static List<String> findParamKeys(String con) {
        Matcher m = key.matcher(con);
        List ret = new ArrayList();
        while (m.find()) {
            ret.add(m.group(1));
        }
        return ret;
    }

}
